﻿
namespace ShoppingCart.WebSite
{
    using System;
    using System.Configuration;
    using System.Linq;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Business.Entity.Enums;
    using Business.Logic;
    using WebSite.Code;
    using SC = Business.Entity;

    public partial class Carrito : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MasterPage.UpdateCarrito += MasterPageUpdateCarrito;

            if (Page.IsPostBack) return;
            Step = "3";
            LoadProvincias();
            LoadDocumentos();
            LoadBancos();
            LoadCliente();
            LoadCarrito();
            panDesplegable.Visible = false;
        }

        private void MasterPageUpdateCarrito(object sender, EventArgs e)
        {
            LoadCarrito();
        }

        protected void DdlProvinciaSelectedIndexChanged(object sender, EventArgs e)
        {
            LoadDistrtios(Convert.ToInt32(ddlProvincia.SelectedValue));
        }

        protected void DdlDistritoSelectedIndexChanged(object sender, EventArgs e)
        {
            CalcularMontos();
        }

        protected void GvProductosRowCommand(object sender, GridViewCommandEventArgs e)
        {
            switch (e.CommandName)
            {
                case "Actualizar":
                    {
                        var idProducto = Convert.ToInt32(e.CommandArgument);
                        var producto = Carrito.Single(p => p.IdProducto == idProducto);
                        var txtCantidad = (TextBox) ((LinkButton) e.CommandSource).Parent.FindControl("txtCantidad");
                        producto.Cantidad = Convert.ToInt32(txtCantidad.Text);
                        AddProducto(producto);
                        LoadCarrito();
                        break;
                    }
                case "Eliminar":
                    {
                        var idProducto = Convert.ToInt32(e.CommandArgument);
                        RemoveProducto(idProducto);
                        LoadCarrito();
                        break;
                    }
            }
        }

        protected void ChkEnviarCheckedChanged(object sender, EventArgs e)
        {
            panDesplegable.Visible = chkEnviar.Checked;
        }

        protected void DdlBancoSelectedIndexChanged(object sender, EventArgs e)
        {
            LoadCuentas(Convert.ToInt32(ddlBanco.SelectedValue));
        }

        protected void DdlCuentaSelectedIndexChanged(object sender, EventArgs e)
        {
            var idCuenta = Convert.ToInt32(ddlCuenta.SelectedValue);
            var cuenta = CuentaManager.Instancia.Obtener(idCuenta);
            litMoneda.Text = cuenta.Moneda;
        }

        protected void DdlDocumentoSelectedIndexChanged(object sender, EventArgs e)
        {
            var cliente = ClienteManager.Instancia.Obtener(IdCliente);
            var documento = (Documento)Enum.Parse(typeof(Documento), ddlDocumento.SelectedValue);
            switch (documento)
            {
                case Documento.Boleta:
                    litTipoDocumento.Text = "DNI";
                    txtNroDocumento.MaxLength = 8;
                    meeNroDocumento.Mask = "999999999";
                    if (cliente != null) txtNroDocumento.Text = cliente.Dni;
                    break;
                case Documento.Factura:
                    litTipoDocumento.Text = "RUC";
                    txtNroDocumento.MaxLength = 11;
                    meeNroDocumento.Mask = "99999999999";
                    if (cliente != null) txtNroDocumento.Text = cliente.Ruc;
                    break;
            }
        }

        protected void BtnRegistrarClick(object sender, EventArgs e)
        {
            if (User.IsInRole("Administrador")) Response.Redirect("Carrito.aspx", true);
            if (IdCliente != 0)
            {
                try
                {
                    var pedido = new SC.Pedido
                                     {
                                         Cliente = new SC.Cliente { IdCliente = IdCliente },
                                         Departamento = new SC.Departamento { IdDepartamento = IdDepartamento },
                                         Fecha = DateTime.Now,
                                         Estado = (byte)Estado.EnEspera,
                                         Descripcion = txtComentarios.Text,
                                         Cuenta = new SC.Cuenta { IdCuenta = Convert.ToInt32(ddlCuenta.SelectedValue) },
                                         NroOperacion = txtNumeroOperacion.Text,
                                         FechaOperacion = GetCurrentDatetime(txtFechaOperacion.Text),
                                         Documento = (byte)Enum.Parse(typeof(Documento), ddlDocumento.SelectedValue), 
                                         Detalle = new SC.Collections.DetallePedidoCollection()
                                     };
                    if(chkEnviar.Checked)
                    {
                        var envio = new SC.Envio
                                        {
                                            Distrito = new SC.Distrito { IdDistrito = Convert.ToInt32(ddlDistrito.SelectedValue) },
                                            Direccion = txtDireccion.Text,
                                            Comentario = txtReferencia.Text,
                                            Costo = CurrencyToDecimal(litTotalNeto.Text),
                                            Estado = (byte)Estado.EnEspera
                                        };
                        pedido.Envio = envio;
                    }
                    foreach (var producto in Carrito)
                    {
                        pedido.Detalle.Add(new SC.DetallePedido
                                               {
                                                   Producto = new SC.Producto { IdProducto = producto.IdProducto },
                                                   Cantidad = producto.Cantidad,
                                                   Precio = producto.Precio,
                                                   Descuento = 0
                                               });
                    }
                    var cliente = ClienteManager.Instancia.Obtener(IdCliente);
                    var documento = (Documento)Enum.Parse(typeof(Documento), ddlDocumento.SelectedValue);
                    switch (documento)
                    {
                        case Documento.Boleta: 
                            cliente.Dni = txtNroDocumento.Text; 
                            break;
                        case Documento.Factura: 
                            cliente.Ruc = txtNroDocumento.Text; 
                            break;
                    }
                    ClienteManager.Instancia.Modificar(cliente);
                    var idPedido = PedidoManager.Instancia.Agregar(pedido);
                    Session.Remove("Carrito");
                    Response.Redirect("Completado.aspx?codigo=" + idPedido, true);
                }
                catch (Exception)
                {
                    ClientScript.RegisterStartupScript(GetType(), "mostrar2", "alert('El Registro No pudo grabarse, por favor de nuevo o más tarde');", true);
                }
            }
            else
            {
                ClientScript.RegisterStartupScript(GetType(), "mostrar3", "alert('Primero debe registrarse como Cliente.'); window.location = 'Registrar.aspx';", true);
            }
        }

        private void LoadProvincias()
        {
            var provincias = ProvinciaManager.Instancia.ListarPorIdDepartamento(IdDepartamento, true);
            provincias = provincias.Where(p => p.Estado).ToList();
            BindControl<SC.Provincia>.BindDropDownList(ddlProvincia, provincias);
            if (provincias.Count != 0)
            {
                LoadDistrtios(provincias.First().IdProvincia);
            }
            else
            {
                ddlDistrito.DataBind();
            }
        }

        private void LoadDistrtios(int idProvincia)
        {
            var distritos = DistritoManager.Instancia.ListarPorIdProvincia(idProvincia, true);
            distritos = distritos.Where(d => d.Estado).ToList();
            BindControl<SC.Distrito>.BindDropDownList(ddlDistrito, distritos);
        }

        private void LoadDocumentos()
        {
            ddlDocumento.DataSource = Enum.GetNames(typeof(Documento));
            ddlDocumento.DataBind();
        }

        private void LoadBancos()
        {
            var bancos = BancoManager.Instancia.Listar();
            BindControl<SC.Banco>.BindDropDownList(ddlBanco, bancos);
            litMoneda.Text = string.Empty;
            if (bancos.Count == 0) return;
            LoadCuentas(bancos.First().IdBanco);
        }

        private void LoadCuentas(int idBanco)
        {
            var cuentas = CuentaManager.Instancia.ListarPorIdBanco(idBanco);
            ddlCuenta.DataTextField = "Numero";
            ddlCuenta.DataValueField = "IdCuenta";
            ddlCuenta.DataSource = cuentas;
            ddlCuenta.DataBind();
            if (cuentas.Count == 0) return;
            litMoneda.Text = cuentas.First().Moneda;
        }

        private void LoadCliente()
        {
            var cliente = ClienteManager.Instancia.Obtener(IdCliente);
            if (cliente == null) return;
            litCliente.Text = string.Format("{0}, {1}", cliente.Apellidos.ToUpper(), cliente.Nombre);
            txtNroDocumento.Text = cliente.Dni;
        }

        private void LoadCarrito()
        {
            BindControl<SC.Producto>.BindGrid(gvProductos, Carrito);
            CalcularMontos();
            upRegistro.Update();
        }

        private void CalcularMontos()
        {
            var monto = Carrito.Sum(p => p.Cantidad * p.Precio);
            litTotal.Text = monto.ToString("C");

            if (ddlDistrito.SelectedValue == null) return;

            var idDistrito = Convert.ToInt32(ddlDistrito.SelectedValue);
            var distrito = DistritoManager.Instancia.Obtener(idDistrito);

            var cantidad = Carrito.Sum(p => p.Cantidad);
            monto += distrito.Flete*cantidad;

            var path = Server.MapPath(ConfigurationManager.AppSettings["Parametros"]);
            var parametros = ParametroManager.Instancia.Listar(path);
            if (parametros.Count == 3)
            {
                var parametroA = parametros[0];
                if (cantidad > parametroA.Cantidad)
                {
                    var parametroB = parametros[1];
                    if (cantidad > parametroB.Cantidad)
                    {
                        var parametroC = parametros[2];
                        if(cantidad > parametroC.Cantidad)
                        {
                            monto = monto - parametroC.Descuento;
                            litDescuentoEnvio.Text = "Por la compra mayor a " + parametroC.Cantidad + " productos su descuento es " + parametroC.Descuento.ToString("C");
                        }
                        else
                        {
                            monto = monto - parametroB.Descuento;
                            litDescuentoEnvio.Text = "Por la compra mayor a " + parametroB.Cantidad + " productos su descuento es " + parametroB.Descuento.ToString("C");
                        }
                    }
                    else
                    {
                        monto = monto - parametroA.Descuento;
                        litDescuentoEnvio.Text = "Por la compra mayor a " + parametroA.Cantidad + " productos su descuento es " + parametroA.Descuento.ToString("C");
                    }
                }
                else litDescuentoEnvio.Text = "S/.0.00, la cantidad comprada no asciende a un descuento.";
            }
            else litDescuentoEnvio.Text = "S/.0.00, la cantidad comprada no asciende a un descuento.";

            litTotalNeto.Text = monto.ToString("C");
        }
    }
}
